/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is Forte for Java, Community Edition. The Initial * Developer of the Original Code is Sun Microsystems, Inc. Portions * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.objectbrowser; import java.util.*; import org.openide.TopManager; import org.openide.filesystems.FileSystem; import org.openide.filesystems.FileStateInvalidException; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileEvent; import org.openide.filesystems.FileChangeAdapter; import org.openide.filesystems.FileChangeListener; import org.openide.filesystems.RepositoryListener; import org.openide.filesystems.RepositoryEvent; import org.openide.filesystems.RepositoryReorderedEvent; import org.openide.loaders.DataFilter; import org.openide.loaders.DataFolder; import org.openide.loaders.DataObject; import org.openide.loaders.DataObjectNotFoundException; import org.openide.loaders.DataLoaderPool; import org.openide.nodes.FilterNode; import org.openide.nodes.Node; import org.openide.nodes.Children; import org.openide.nodes.Children.SortedMap; import org.openide.nodes.NodeAdapter; import org.openide.util.WeakListener; import org.openide.util.enum.AlterEnumeration; import org.openide.util.enum.EmptyEnumeration; import org.openide.util.enum.SingletonEnumeration; import org.openide.util.enum.SequenceEnumeration; /** * Produces package node tree hierarchy. * * @author Jan Jancura */ public class TreeNode extends FilterNode { // init .................................................................................. /** * Creates hierarchy of packages for node representing repository. */ TreeNode (Node original) { this (original, new DataFilter () { public boolean acceptDataObject (DataObject d) { return d instanceof DataFolder; } }); } /** * Creates filtered hierarchy of packages for node representing repository. */ TreeNode (Node original, DataFilter dataFilter) { super (original, new RootChildren (dataFilter)); } // innerclasses ......................................................................... static private class RootChildren extends Children.Keys implements RepositoryListener { /** Current DataFilter */ private DataFilter dataFilter; // init .............................................................................. /** * Create PackageChildren with given filter. */ RootChildren (DataFilter dataFilter) { this.dataFilter = dataFilter; } // Keys support ...................................................................... /** * Lazy initialization method. */ protected void addNotify () { refreshKeys (); TopManager.getDefault ().getRepository ().addRepositoryListener ( new WeakListener.Repository (this) ); } /** * Finds representing node for given FileSystem. */ protected Node[] createNodes (Object key) { try { if ((!((FileSystem) key).isHidden ()) && ((FileSystem) key).isValid () ) { FileObject fo = ((FileSystem) key).getRoot (); DataFolder df = (DataFolder) DataObject.find (fo); if (dataFilter.acceptDataObject (df)) return new Node [] { // new RootFolderNode (df, Children.LEAF) df.new FolderNode (new PackageChildren (fo, dataFilter)) { String name; public String getDisplayName () { try { if (name != null) return name; FileObject file; return name = getDataObject ().getPrimaryFile ().getFileSystem (). getDisplayName (); } catch (FileStateInvalidException ee) { return "???"; // NOI18N } } } }; } } catch (DataObjectNotFoundException ee) { } return new Node [0]; } /** * Release keys. */ protected void removeNotify () { setKeys (java.util.Collections.EMPTY_SET); } // RepositoryListener support ......................................................... /** * Adds packages for given FS. */ public void fileSystemAdded (final RepositoryEvent ev) { refreshKeys (); } /** * Removes packages of given FS. */ public void fileSystemRemoved (RepositoryEvent ev) { refreshKeys (); } /** * Does nothing. */ public void fileSystemPoolReordered (RepositoryReorderedEvent ev) { } // other methods ..................................................................... /** * Creates keys. */ void refreshKeys () { setKeys (TopManager.getDefault ().getRepository ().toArray ()); } } static private class PackageChildren extends Children.Keys { /** Representing FileObject */ private FileObject fileObject; /** Current DataFilter */ private DataFilter dataFilter; /** Listens on package */ private FileChangeListener myFerret = new FileChangeAdapter () { public void fileFolderCreated (FileEvent fe) { refreshKeys (); } public void fileDeleted (FileEvent fe) { refreshKeys (); } }; // init .............................................................................. /** * Create PackageChildren with given filter. */ PackageChildren (FileObject fo, DataFilter dataFilter) { fileObject = fo; this.dataFilter = dataFilter; } // Keys support ...................................................................... /** * Lazy initialization method. */ protected void addNotify () { refreshKeys (); fileObject.addFileChangeListener (myFerret); } /** * Finds representing node for given FileSystem. */ protected Node[] createNodes (Object key) { try { DataFolder df = (DataFolder) DataObject.find ((FileObject) key); if (dataFilter.acceptDataObject (df)) return new Node [] { df.new FolderNode (new PackageChildren ((FileObject) key, dataFilter)) }; } catch (DataObjectNotFoundException ee) { } return new Node [0]; } /** * Release keys. */ protected void removeNotify () { fileObject.removeFileChangeListener (myFerret); setKeys (java.util.Collections.EMPTY_SET); } // RepositoryListener support ......................................................... /** * Adds packages for given FS. */ public void fileSystemAdded (final RepositoryEvent ev) { refreshKeys (); } /** * Removes packages of given FS. */ public void fileSystemRemoved (RepositoryEvent ev) { refreshKeys (); } /** * Does nothing. */ public void fileSystemPoolReordered (RepositoryReorderedEvent ev) { } // other methods ..................................................................... /** * Creates keys. */ void refreshKeys () { Enumeration e = fileObject.getFolders (false); ArrayList al = new ArrayList (); while (e.hasMoreElements ()) al.add (e.nextElement ()); setKeys (al.toArray ()); } } } /* * Log * 4 Gandalf 1.3 1/13/00 Radko Najman I18N * 3 Gandalf 1.2 10/23/99 Ian Formanek NO SEMANTIC CHANGE - Sun * Microsystems Copyright in File Comment * 2 Gandalf 1.1 6/9/99 Ian Formanek ---- Package Change To * org.openide ---- * 1 Gandalf 1.0 5/9/99 Jan Jancura * $ */